# Imports
import os
from keras.layers import *
from keras.models import Model, load_model
from keras.regularizers import l2
from keras.callbacks import ModelCheckpoint
from keras.optimizers import RMSprop, Adam, SGD
import matplotlib.pyplot as plt
import scipy.misc as m
def SConvNet(window_size):
inp = Input(shape=(None,None,3))
n = window_size//2
conv = Conv2D(8, (3,3), activation='relu', padding='valid')(inp)
for i in range(1, n):
conv = Conv2D(2**(i//3 + 3), (3,3), activation='relu', padding='valid')(conv)
conv = Conv2D(2, (1,1), activation='softmax')(conv)
model = Model(inputs=inp, outputs=conv)
return model
sconv_model = SConvNet(29)
sconv_model.summary()
dir_drive = "/home/augustocms/datasets/drive/training/"
dir_img = dir_drive + "images/"
dir_seg = dir_drive + "1st_manual/"
dir_test = "/home/augustocms/datasets/drive/test/"
dir_test_img = dir_test + "images/"
dir_test_seg = dir_test + "1st_manual/"
dir_mask = dir_drive + "mask/"
with open(dir_drive + 'train.txt') as f:
x = f.read().splitlines()
imgs = np.array(x)
with open(dir_drive + 'val.txt') as f:
x = f.read().splitlines()
val_imgs = np.array(x)
with open(dir_test + 'test.txt') as f:
x = f.read().splitlines()
test_imgs = np.array(x)
print(imgs[0])
def sliding_window(ing, size, mask):
windows = []
h, w, *c = ing.shape
wsize = size//2
for i in range(wsize, h-wsize):
for j in range(wsize, w-wsize):
if mask[i,j] > 0:
windows.append(ing[i-wsize:i+wsize+1, j-wsize:j+wsize+1])
return np.array(windows)
def sliding_window_gt(ing, size, mask):
windows = []
h, w, *c = ing.shape
wsize = size//2
for i in range(wsize, h-wsize):
for j in range(wsize, w-wsize):
if mask[i, j] > 0:
windows.append(ing[i, j])
return windows
def categorize(ing, nclasses=2):
out = np.zeros((*ing.shape, nclasses))
for i in range(nclasses):
out[:,i] = (ing[:] == i).astype(int)
return out
images = []
gt = []
mask = []
for line in imgs:
names = line.split(' ')
img = m.imread(dir_img + names[0])
seg = m.imread(dir_seg + names[1])
maskim = m.imread(dir_mask + names[2])
images.append(img)
gt.append(seg)
mask.append(maskim)
fig = plt.figure(figsize=(20,40))
ax = fig.add_subplot(1,3,1)
ax.imshow(img)
ax.set_title("Original Image")
ax = fig.add_subplot(1,3,2)
ax.imshow(seg, cmap='gray')
ax.set_title('Ground Truth')
ax = fig.add_subplot(1,3,3)
ax.imshow(maskim, cmap='gray')
ax.set_title('Mask')
plt.show()
images = np.array(images)
patch_size = 29
X_train = []
y_train = []
skel = []
for i, img in enumerate(images):
seg_img = gt[i]/255
mask_im = mask[i]
X_train.append(sliding_window(img, patch_size, mask_im))
y_patches = categorize(np.array(sliding_window_gt(seg_img, patch_size, mask_im)))
y_train.append(y_patches)
X_train = np.array(X_train)
y_train = np.array(y_train)
X_train = np.vstack(X_train)
y_train = np.vstack(y_train)
y_train = np.reshape(y_train, (-1, 1, 1, 2))
print(X_train.shape, y_train.shape)
X_val = []
y_val = []
skel_val = []
for line in val_imgs:
names = line.split(' ')
val_img = m.imread(dir_img + names[0])
val_seg = m.imread(dir_seg + names[1])/255
X_val.append(sliding_window(val_img, patch_size, mask_im))
y_patches = categorize(np.array(sliding_window_gt(val_seg, patch_size, mask_im)))
y_val.append(y_patches)
X_val, y_val = np.array(X_val), np.array(y_val)
X_val = np.vstack(X_val)
y_val = np.vstack(y_val)
y_val = np.reshape(y_val, (-1, 1, 1, 2))
print(X_val.shape, y_val.shape)
opt = Adam(lr=1e-4)
sconv_model.compile(loss='binary_crossentropy',
optimizer=opt,
metrics=['accuracy'])
checkpoint = ModelCheckpoint('weights/sconvnet_drive.hdf5', monitor='val_loss', verbose=1, save_best_only=True, mode='min')
# sconv_model.load_weights('sconvnet_drive.hdf5')
# sconv_model.fit(X_train, y_train,
# validation_data=(X_val, y_val),
# epochs=2, batch_size=128,
# verbose=2,
# callbacks=[checkpoint])
# sconv_model.save('models/sconvnet_drive.h5')
sconv_model = load_model('models/sconvnet_drive.h5')
def categorize2d(ing, nclasses=2):
out = np.zeros((*ing.shape, nclasses))
for i in range(nclasses):
out[:,:,i] = (ing[:,:] == i).astype(int)
return out
X_test = []
y_test = []
for line in test_imgs:
names = line.split(' ')
test_img = m.imread(dir_test_img + names[0])
test_seg = m.imread(dir_test_seg + names[1])
X_test.append(test_img)
y_ing = categorize2d(np.array(test_seg/255))
y_test.append(y_ing)
y_test = np.array(y_test)
y_test = np.squeeze(y_test)
X_test = np.array(X_test)
print(X_test.shape, y_test.shape)
y_pred = sconv_model.predict(X_test[:,:,:,:])
y_predi = np.argmax(y_pred, axis=3)
y_testi = np.argmax(y_test, axis=3)
print(y_testi.shape,y_predi.shape)
gtp = (y_testi == 1).astype(int)[:,14:-14,14:-14]
pp = (y_predi == 1).astype(int)
gtn = (y_testi == 0).astype(int)[:,14:-14,14:-14]
pn = (y_predi == 0).astype(int)
TP = (gtp*pp).sum()
TN = (gtn*pn).sum()
FP = (gtn*pp).sum()
FN = (gtp*pn).sum()
Precision = TP/(TP+FP)
Sensitivity = TP/(TP+FN)
print(Precision, Sensitivity)
shape = (584, 565)
n_classes= 1
for i in range(10):
img_is = X_test[i]
seg = y_predi[i]
segtest = y_testi[i]
fig = plt.figure(figsize=(20,40))
ax = fig.add_subplot(1,3,1)
ax.imshow(img_is, cmap='gray')
ax.set_title("original")
ax = fig.add_subplot(1,3,2)
ax.imshow(seg, cmap='gray')
ax.set_title("predicted class")
ax = fig.add_subplot(1,3,3)
ax.imshow(segtest, cmap='gray')
ax.set_title("true class")
plt.show()
# m.imsave('images/drive/'+str(i)+'_orig.png', img_is)
m.imsave('images/drive/'+str(i)+'_pred_sconv.png', seg)
# m.imsave('images/drive/'+str(i)+'_segm.png', segtest)
dir_dibco = "/home/augustocms/scratch/DIBCO/"
with open(dir_dibco + 'train.txt') as f:
x = f.read().splitlines()
imgs = np.array(x)
with open(dir_dibco + 'val.txt') as f:
x = f.read().splitlines()
val_imgs = np.array(x)
with open(dir_dibco + 'test.txt') as f:
x = f.read().splitlines()
test_imgs = np.array(x)
print(imgs[0])
images = []
gt = []
mask = []
for line in imgs:
names = line.split()
img = m.imread(dir_dibco + names[0], mode='RGB')
seg = m.imread(dir_dibco + names[1], mode='L')
mask.append(np.ones(seg.shape)) # Create mask with all ones
images.append(img)
gt.append(seg)
fig = plt.figure(figsize=(20,40))
ax = fig.add_subplot(1,2,1)
ax.imshow(img)
ax.set_title("Original Image")
ax = fig.add_subplot(1,2,2)
ax.imshow(seg, cmap='gray')
ax.set_title('Ground Truth')
plt.show()
images = np.array(images)